package com.example.demozy.controller;

import com.example.demozy.api.CommonResult;
import com.example.demozy.entity.User;
import com.example.demozy.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author 王成龙
 */
@RestController
public class RegisterController {
    // **************** 公开变量

    // **************** 私有变量

    @Autowired
    private UserService userService;

    // **************** 继承方法

    // **************** 公开方法

    /**
     * @param user
     */
    @PostMapping(value = "/register")
    public CommonResult register(@RequestBody User user) {
        String account = user.getAccount();
        String userPwd = user.getUserPwd();
        String mobile = user.getMobile();
        //检验是否为空
        if ("".equals(account) || "".equals(userPwd) || "".equals(mobile)) {
            return CommonResult.failed("账号、密码或手机号不能为空！");
        }
        //检验账号和手机号是否包含特殊字符串
        if (isSpecialChar(account) || isSpecialChar(mobile)) {
            return CommonResult.failed("账号或手机号不能包含特殊字符串！");
        }
        //检验账号密码长度，若中文超过8位或字母加数字超过16位，则校验不通过
        int accountLength = getStringLengthRegex(account);
        int userPwdLength = getStringLengthRegex(userPwd);
        int mobileLength = getStringLengthRegex(mobile);
        if (accountLength > 16 || userPwdLength > 16) {
            return CommonResult.failed("账号或密码过长！");
        }
        //检验手机号长度，必须为11位
        if (mobileLength != 11) {
            return CommonResult.failed("手机号必须为11位！");
        }
        //检验手机号格式
        if (!isValidPhoneNumber(mobile)) {
            return CommonResult.failed("手机号格式有误！");
        }
        //进行注册操作
        userService.save(account, userPwd, mobile);
        //返回结果以及刚注册的用户信息
        int userId = userService.getMaxUserId();
        //新增基本信息表记录
        userService.saveBasicInfo(userId);
        return CommonResult.success(userService.getUserByUserId(userId),"注册成功！");
    }

    /**
     * 验证手机号是否重复
     * @param mobile
     * @return
     */
    @PostMapping(value = "/checkMobileRepeats")
    public CommonResult checkMobileRepeats(@RequestParam("mobile") String mobile) {
        //检验手机号长度，必须为11位
        if (getStringLengthRegex(mobile) != 11) {
            return CommonResult.failed("手机号必须为11位！");
        }
        //检验手机号格式
        if (!isValidPhoneNumber(mobile)) {
            return CommonResult.failed("手机号格式有误！");
        }
        //判断手机号是否重复
        if (mobile.equals(userService.getMobileByMobile(mobile))) {
            return CommonResult.validateFailed("此手机号已被注册！");
        }
        return CommonResult.success(null,"未重复");
    }

    /**
     * 检验账号是否重复
     * @param account
     * @return
     */
    @PostMapping(value = "/checkAccountRepeats")
    public CommonResult checkAccountRepeats(@RequestParam("account") String account) {
        //检验账号是否包含特殊字符串
        if (isSpecialChar(account)) {
            return CommonResult.failed("账号不能包含特殊字符！");
        }
        //检验账号长度
        if (getStringLengthRegex(account) > 16) {
            return CommonResult.failed("账号过长(中文最长8位，字母与数字组合最长16位)！");
        }
        //判断账号是否重复
        if (account.equals(userService.getAccountByAccount(account))) {
            return CommonResult.validateFailed("此账号已被注册！");
        }
        return CommonResult.success(null,"未重复");
    }

    /**
     * 判断是否含有特殊字符
     *
     * @param str
     * @return true为包含，false为不包含
     */
    public boolean isSpecialChar(String str) {
        String regEx = "[ _`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~！@#￥%……&*（）——+|{}【】‘；：”“’。，、？]|\n|\r|\t";
        Pattern p = Pattern.compile(regEx);
        Matcher m = p.matcher(str);
        return m.find();
    }

    /**
     * 正则获取字符串长度
     * 基本原理是将字符串中所有的非标准字符（双字节字符）替换成两个标准字符（**，或其他的也可以）。
     * 这样就可以直接例用length方法获得字符串的字节长度了
     * @param str
     */
    public int getStringLengthRegex(String str) {
        str = str.replaceAll("[^\\x00-\\xff]", "**");
        int length = str.length();
        return length;
    }

    /**
     * 检验手机号格式是否正确
     * @param phoneNumber
     * @return
     */
    public static boolean isValidPhoneNumber(String phoneNumber) {
        if ((phoneNumber != null) && (!phoneNumber.isEmpty())) {
            return Pattern.matches("^1[3-9]\\d{9}$", phoneNumber);
        }
        return false;
    }


    // **************** 私有方法

}
